package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 1.定义模型
type User struct {
	gorm.Model //ID CreateAt UpdateAt DeleteAt
	Name       string
	Age        int64
}

func main() {
	//连接MYSQL数据库
	dsn := "root:flm@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	// 2.把模型与数据库中的表对应起来
	db.AutoMigrate(&User{})

	// 3.创建
	// u1 := User{Name: "flm1", Age: 17}
	// db.Create(&u1)
	// u2 := User{Name: "flm2", Age: 18}
	// db.Create(&u2)

	// 4.查询
	//var user User // 声明结构体类型变量user
	user := new(User) //new和make区别 make:给固定的几个map slice 等申请内存申请什么返回什么, new返回的是指针new什么什么类型指针
	//根据主键查询第一条记录(主键得是数字)
	// db.First(user) //.Take 随机一条 .Last 最后一条 .Find(&users) 查询所有的记录 .First(&user, 10) 查询指定的记录(主键为整型)
	// fmt.Printf("user:%$v\n", user)

	// var users []User
	// db.Find(&users)
	// fmt.Printf("Users:%#v\n", users)

	//FirstOrInit
	db.FirstOrInit(user, User{Name: "真竜"}) //找到第一个或初始化一个新的(初始化不会直接加入表)
	fmt.Printf("user:%v\n", user)

}

//Where 指定条件  Not排除条件  Or 或者
//Select 指定从数据库检索出的字段 Order 排序, 指定检索出记录顺序 Limit 指定检索出最大记录数
//Offset 偏移 指定开始返回前跳过的记录数 Count 总数(必须是最后一个操作)

//GORM中的 Scopes 是一个强大的特性，它允许您将常用的查询条件定义为可重用的方法。
//这些作用域可以很容易地在查询中引用，从而使代码更加模块化和可读。

// // Scope for filtering records where amount is greater than 1000
// func AmountGreaterThan1000(db *gorm.DB) *gorm.DB {
// 	return db.Where("amount > ?", 1000)
// }

// // Scope for orders paid with a credit card
// func PaidWithCreditCard(db *gorm.DB) *gorm.DB {
// 	return db.Where("pay_mode_sign = ?", "C")
// }
// // 使用 scopes 来寻找所有的 金额大于1000的信用卡订单
// db.Scopes(AmountGreaterThan1000, PaidWithCreditCard).Find(&orders)

//链式操作
//db.Where("name = ?", "jinzhu").Where("age = ?", 18).First(&user)

// 内嵌子查询
// subQuery := db.Select("AVG(age)").Where("name LIKE ?", "name%").Table("users")
// db.Select("AVG(age) as avgage").Group("name").Having("AVG(age) > (?)", subQuery).Find(&results)
// SQL: SELECT AVG(age) as avgage FROM `users` GROUP BY `name` HAVING AVG(age) > (SELECT AVG(age) FROM `users` WHERE name LIKE "name%")
